#!/bin/bash

# 编译 Java 程序
javac Main.java

# 启动 Java 程序并获取 PID
java -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics Main &

PID=$!

# 获取程序开始时间
start_time=$(date +%s)

# 初始化变量
object_count=0
object_bytes=0
max_memory_usage=0  # 新增变量，用于存储最大内存占用值
young_gc_count=0
full_gc_count=0

# 持续收集数据
while ps -p $PID > /dev/null; do
    echo "------------------------"

    # 获取占用内存大小（使用 ps，并更新最大内存占用值）
    current_memory_usage=$(ps -p $! -o rss | tail -n 1)
    if [ $current_memory_usage -gt $max_memory_usage ]; then
        max_memory_usage=$current_memory_usage
    fi

    # 获取触发 Young GC 的次数（使用 jstat）
    young_gc_count=$(jstat -gc $PID | tail -n 1 | awk '{print $13}')

    # 获取触发 Full GC 的次数（使用 jstat）
    full_gc_count=$(jstat -gc $PID | tail -n 1 | awk '{print $15}')

    # 获取当前对象数量（使用 jmap）
    object_count=$(jmap -histo $PID | tail -n 1 | awk '{print $2}')

    # 获取当前对象占用的内存大小（使用 jmap）
    object_bytes=$(jmap -histo $PID | tail -n 1 | awk '{print $3}')

    echo "触发Young GC数量：$young_gc_count"
    echo "触发Full GC数量：$full_gc_count"
    echo "当前对象数量：$object_count"
    echo "当前对象占用的内存大小：$object_bytes"
    echo "当前最大内存占用：$max_memory_usage KB"  # 输出当前最大内存占用值

    # 每次获取数据之间的时间间隔（可根据需要调整）
    sleep 0.2
done

# 获取程序结束时间
end_time=$(date +%s)
run_time=$((end_time - start_time))
echo "运行时间：$run_time 秒"
echo "最大内存占用：$max_memory_usage KB"  # 输出最大内存占用值

# 编译 Java 程序
javac Main.java

# 启动 Java 程序并获取 PID
java Main &

PID=$!

# use perf to collect data
sudo perf_5.15 stat -p $PID
